6
תגובות

מחלקה בתוך מחלקה

פתח soogo ,
יש לי מחלקת DB ומחלקת USER
איך אני יכול להשתמש ב DB בתוך ה USER?

6 תשובות

avatar ענה ldbrgr ב 04 לפברואר 2015 #

http://phpguide.co.il/phplive?code=1020

<?php

class DB
{
    /**
   * Query ..
   *
   * @param string $query
   * @return string
   */

  public function query($query)
  {
    return $query;
  }
}
 
class User
{
  /**
   * @var DB
   */

  protected $db;
 
  /**
   * New User ...
   *
   * @param DB $db
   * @return void
   */

  public function __construct($db)
  {
    $this->db = $db;
  }
 
  /**
   * Get DB ...
   *
   * @return DB
   */

  protected function getDB()
  {
    return $this->db;
  }
 
  /**
   * Use DB Class ...
   *
   * @return string
   */

  public function useDBClass()
  {
    return $this->getDB()->query('SELECT 1;');
  }
}

$db  = new DB;
$user = new User($db);
print $user->useDBClass(); // prints 'SELECT 1;' ..

avatar ענה soogo ב 06 לפברואר 2015 #

מה לגבי EXTEND ?

avatar ענה ldbrgr ב 07 לפברואר 2015 #

מה הבעיה? אתה פשוט מעביר מופע של מחלקה DB למחלקה User..
לא משנה עם המחלקה יורשת או לא..

avatar ענה soogo ב 08 לפברואר 2015 #

ומה עדיף?

avatar ענה Splash ב 09 לפברואר 2015 #

המחלקה User לא מממשת פונקציות של DB אלה משתמשת בהן,במידה ואתה רוצה ליצור פונקציות אחידות כמו get,first,exist וכל מיני שטויות כאלה תדאג שהמחלקות של שמתקשורת ל DB יממשו interface.

avatar ענה HtmHell ב 16 לפברואר 2015 #

משתמשים ב-Extend רק אם יש קשר של הורה-ילד בין המחלקות. לדוגמה, מחלקת "מכונית מירוץ" תירש את מחלקת מכונית, ומחלקת "ילד" תירש את מחלקת "בן אדם", אבל מחלקת " משתמש" לא תירש את מחלקת "מסד", כי אין פה קשר מתאים.

זה מצויין שהעברת את המחלקה בפרמטר, אבל למה הוספת מתודת getDB? הרי הרעיון הוא שהמחלקה User תשתמש במחלקת המסד בתוך המתודות שלה, ואתה רק תקרא למתודות, בלי להשתמש במסד מחוץ למחלקה.
עדיף כמובן לפצל את זה עם מחלקת ריפוזיטורי, אבל תתחיל בזה.

בכל מקרה, ממליץ לך לקרוא את הספר של אלכס על תכנות מונחה עצמים, מאוד מומלץ! אתה תבין בהרבה יותר על מה מדובר, ומהי הדרך הנכונה לממש את זה.